package middlewares

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

// Cors 处理跨域请求,支持options访问
// "跨域"是一个网络安全的概念，起源于浏览器的同源策略。同源策略是一种约定，它是由网景（Netscape）公司提出的一个重要的安全策略。所谓同源是指"协议+域名+端口号"三者相同，只要不同时，就算是不同源
func Cors() gin.HandlerFunc {
	return func(c *gin.Context) {
		method := c.Request.Method
		origin := c.Request.Header.Get("Origin")
		c.Header("Access-Control-Allow-Origin", origin)                                                                                                       //定义了那些域名可以访问资源。如果设置为“*”，则表示允许所有域名进行访问
		c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,Access-Control-Expose-Headers,X-CSRF-Token,Authorization,Token,X-Token,X-User-Id") //定义浏览器在实际请求中可以携带哪种类型的header。通常设置为一些自定义的Header，如上例中的"Content-Type,AccessToken,X-CSRF-Token, Authorization, Token"，这几项代表这些Header是可以被允许传递的
		c.Header("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE,PUT")                                                                               //定义了可以支持哪些HTTP动词，如“POST, GET, OPTIONS”                                                                          //定义了可以支持哪些HTTP动词，如“POST, GET, OPTIONS”
		c.Header("Access-Control-Expose-Headers", "Content-Length,Access-Control-Allow-Origin,Access-Control-Allow-Headers,Content-Type,New-Token")           //这个Header让服务器把允许浏览器访问的header白名单填入该字段，让前端可以使用 getResponseHeader 获取到其他信息
		c.Header("Access-Control-Allow-Credentials", "true")                                                                                                  //这个Header定义了是否允许发送Cookie。true表示允许，false表示禁止。通常我们设为true，这样做的目的是为了在跨站请求时能够保持用户的登录状态

		// 放行所有OPTIONS方法
		if method == "OPTIONS" {
			c.AbortWithStatus(http.StatusNoContent)
			return
		}
		// 处理请求
		c.Next()
	}
}
